<?php
//
//namespace app\http;
//
//use think\worker\Server;
//use utils\LogUtils;
//
//
//class Worker extends Server implements \Serializable
//{
//
//    protected $socket = 'websocket://0.0.0.0:2346';
//
////    protected $option = ['transport' => 'ssl'];
////    protected $context = [
////        'ssl' => [
////            //'local_cert' => 'C:\phpstudy_pro\zs\test.kyd5.cn_bundle.pem',
////            //'local_pk' => 'C:\phpstudy_pro\zs\test.kyd5.cn.key',
////            //本地测试
////            //'local_cert'=>'D:\phpstudy_pro\WWW\take-num\zs\local_pem.pem',
////            //'local_pk'=>'D:\phpstudy_pro\WWW\take-num\zs\local_key.key',
////            'verify_peer' => false,
////        ],
////    ];
//
//    public $conn_list01 = [];
//    public $conn_list02 = [];
//    public $startTimeList = [];
//    public $requestStartList = [];
//    //public $startTime = 0;
//    //public $requestStart = false;
//
//    public function __construct()
//    {
//        //$this->context['ssl']['local_cert'] = getFileROOT().'\zs\test.kyd5.cn_bundle.pem';
//        //$this->context['ssl']['local_pk'] = getFileROOT().'\zs\test.kyd5.cn.key';
//        parent::__construct();
//    }
//
//    protected function init()
//    {
//
//        parent::init();
//    }
//
//    public function onWorkerStart()
//    {
////       Timer::add(1,function (){
////
////       });
//    }
//
//    public function onMessage($connection, $d)
//    {
//
//        LogUtils::log($d);
//        if (empty($d)) {
//            $su = $this->fail02(403, '接受到的数据为空');
//            $connection->send($su);
//            return;
//        }
//
//        $data = json_decode($d);
//        if (!isset($data->From)) {
//            //$this->setErrorMessage($connection, 'Device_ID 空,接受到的信息=' . $d);
//            $su = $this->fail02(404, 'From 空,接受到的信息=' . $d);
//            $connection->send($su);
//            return;
//        }
//        $From = 0;
//        $Device_ID = isset($data->Device_ID) ? $data->Device_ID : "";
//        $Websocket = strval(isset($data->Websocket) ? $data->Websocket : "");
//        //来自于客户端
//        if (empty($Device_ID) || $Device_ID == 0 || $Device_ID == '0') {
//            $From = 1;
//            $Device_ID = strval($data->From);
//        }
//        //来自机器端
//        if ($data->From == 0 || $data->From == '0') {
//            if (!isset($data->Device_ID)) {
//                $su = $this->fail02(404, 'Device_ID 空,接受到的信息=' . $d);
//                $connection->send($su);
//                return;
//            }
//            $From = 0;
//            $Device_ID = strval($data->Device_ID);
//        }
//
//        switch (intval($data->Code)) {
//            case 0:
//                if ($From == 1) {
//
//                    $this->clearMyListAndConnId($this->conn_list01,$Device_ID);
//
//                    $this->conn_list01[$Device_ID] = $connection->id;
//                    $connection->send($this->ok2('接受 $From:' . $Device_ID));
//                } else {
//                    // $this->conn_list02 = array_merge($this->conn_list02, [$Device_ID => $connection->id]);
//                    $key = $Device_ID . '@@@@' . $Websocket;
//
//                    $this->clearMyListAndConnId($this->conn_list02,$key);
//
//                    $this->conn_list02[$key] = $connection->id;
//
//                    $connection->send($this->ok2('接受 $Device_ID:' . $Device_ID));
//                }
//                break;
//            case 10:
//                //客户端心跳包(打印的会发送)
//                // 获取当前时间
//                $current_time = date('Y-m-d H:i:s');
//                $su = $this->ok3(10, $current_time);
//                $connection->send($su);
//                //LogUtils::log($Websocket);
//                // if ($Websocket == '0') {
////                    if (empty($this->conn_list01[$Device_ID])) {
////                        $this->setErrorMessage($connection, '通过设备号未找到 前端设备');
////                        return;
////                    }
//                // $this->getConn(1, $Device_ID)->send($d);
//                //调用接口
//                // }
//                if ($this->requestStart || time() - $this->startTime < 1) {
//                    return;
//                }
//                $this->requestStart = true;
//                $this->startTime = time();
//
//                /////////////////////////线下测试使用
//                //$result = postRequest('http://wx.kyd5.cn/jianyang/api/',['siteid'=>$data->Device_ID],false);
//                //////////////////////////线上内网使用
//                $result = postRequest('http://172.64.122.98/jianyang/api/',['siteid'=>$data->Device_ID],false);
//
//                LogUtils::log('返回='.$result);
//
//                $this->requestStart = false;
//                if ($result) {
//                    $result = json_decode($result);
//                    if (!isset($result->data) || empty($result->data) || count($result->data)==0){
//                        return;
//                    }
//                    $r = $result->data[0];
//                    //LogUtils::log($r);
//                    $r->Code = 100;
//                    $r->Call_Type = 'notify|请|@|号到|#|号窗口办理|';
//                    $r->Sound_Type = 0;
//
//                    $r->Call_NO = $r->call_no;
//                    $su = json_encode($r, JSON_UNESCAPED_UNICODE);
//                    //LogUtils::log($su);
//                    //$connection->send($su);
//
//                    $this->setMessage2AllDevice(0, $Device_ID, $su);
//
//                }
//
//                break;
//            case 999:
//                //$a = 3/0;
//                break;
//            default:
//                if ($From == 1) {
//                    //来自前端
//                    if (empty($this->conn_list02[$Device_ID . '@@@@0'])) {
//                        $this->setErrorMessage($connection, '通过设备号未找到 设备');
//                        return;
//                    }
//                    //$this->getConn(2, $Device_ID)->send($d);
//                    $this->setMessage2AllDevice(0, $Device_ID, $d);
//                    $connection->send($this->ok2('成功'));
//                } else {
//                    if (empty($this->conn_list01[$Device_ID])) {
//                        $this->setErrorMessage($connection, '通过设备号未找到 前端设备');
//                        return;
//                    }
//                    $this->getConn(1, $Device_ID)->send($d);
//                    $connection->send($this->ok2('成功'));
//                }
//                break;
//        }
//
//        //var_dump(self::$workerBean);
//    }
//
//
//    public function ok($Data)
//    {
//        $su = ['Code' => 200, 'Data' => $Data, 'message' => 'success'];
//        $su = json_encode($su, JSON_UNESCAPED_UNICODE);
//        return $su;
//    }
//
//    public function ok2($Message)
//    {
//        $su = ['Code' => 200, 'Data' => null, 'message' => $Message];
//        $su = json_encode($su, JSON_UNESCAPED_UNICODE);
//        return $su;
//    }
//
//    public function ok3($Code, $Data)
//    {
//        $su = ['Code' => $Code, 'Data' => $Data, 'message' => null];
//        $su = json_encode($su, JSON_UNESCAPED_UNICODE);
//        return $su;
//    }
//
//    public function fail($Message)
//    {
//        $su = ['Code' => 400, 'Data' => null, 'message' => $Message];
//        $su = json_encode($su, JSON_UNESCAPED_UNICODE);
//        return $su;
//    }
//
//    public function fail02($Code, $Message)
//    {
//        $su = ['Code' => $Code, 'Data' => null, 'message' => $Message];
//        $su = json_encode($su, JSON_UNESCAPED_UNICODE);
//        return $su;
//    }
//
//    /**
//     * @param $connection
//     * @return false|string
//     */
//    public function setErrorMessage($connection, $hint)
//    {
//        $connection->send($this->fail($hint));
//    }
//
//    /**
//     * 当连接建立时触发的回调函数
//     * @param $connection
//     */
//    public function onConnect($connection)
//    {
//        $connection->send($this->ok2('success,id=' . $connection->id));
//    }
//
//    /**
//     * 当连接断开时触发的回调函数
//     * @param $connection
//     */
//    public function onClose($connection)
//    {
//        foreach ($this->conn_list01 as $key => $value) {
//            if ($connection->id == $value) {
//                LogUtils::error('close conn_list01=' . $key . '==' . $value);
//                unset($this->conn_list01[$key]);
//                break;
//            }
//        }
//        foreach ($this->conn_list02 as $key => $value) {
//            if ($connection->id == $value) {
//                LogUtils::error('close conn_list02=' . $key . '==' . $value);
//                unset($this->conn_list02[$key]);
//                break;
//            }
//        }
//        //LogUtils::log("onClose");
//        $this->clear($connection);
//    }
//
//    /**
//     * 当客户端的连接上发生错误时触发
//     * @param $connection
//     * @param $code
//     * @param $msg
//     */
//    public function onError($connection, $code, $msg)
//    {
//        LogUtils::error('worker onError:' . $code . '=' . $msg);
//    }
//
//
//    public function serialize()
//    {
//        // TODO: Implement serialize() method.
//    }
//
//    public function unserialize($data)
//    {
//        // TODO: Implement unserialize() method.
//    }
//
//
//    /**
//     * @param $from
//     * @param $key  不一定一定是 $Device_ID
//     * @return mixed|null
//     */
//    protected function getConn($from, $key)
//    {
//
//        if ($from == 1) {
//            $id = $this->conn_list01[$key];
//        } else {
//            $id = $this->conn_list02[$key];
//        }
//
//        if ($this->worker->connections[$id]){
//            $conn = $this->worker->connections[$id];
//            return $conn;
//        }
//
//        //LogUtils::error('找到');
//        return null;
//    }
//
//    protected function setMessage2AllDevice($from, $Device_ID, $d)
//    {
//        if ($from == 1) {
//
//        } else {
//            foreach ($this->conn_list02 as $key => $value) {
//                // $key = 999@@@@0 , 999@@@@1
//                $array = explode('@@@@', $key);
//
//                if ($array[0] == $Device_ID) {
//                    //池子里面连接存在
//                    if (isset($this->worker->connections[$value])) {
//                        $conn = $this->worker->connections[$value];
//                        $conn->send($d);
//                    }
//                }
//            }
//        }
//    }
//
//    /**
//     * @param $connection
//     */
//    private function clear($connection)
//    {
//        if (isset($connection->id)) {
//            // 连接断开时删除映射
//            unset($this->worker->connections[$connection->id]);
//        }
//    }
//
//    private function clearMyListAndConnId($array,$key)
//    {
//        if (isset($array[$key])) {
//            $id = $array[$key];
//            unset($this->worker->connections[$id]);
//            unset($array[$key]);
//        }
//    }
//
//}